// 力扣65. 有效数字
class Solution {
    public boolean isNumber(String s) {
        // 去除前后空格
        s = s.trim();
        if (s.isEmpty()) {
            return false;
        }

        char[] ch = s.toCharArray();
        boolean hasDigit = false;    // 是否出现过数字
        boolean hasDot = false;      // 是否出现过小数点
        boolean hasE = false;        // 是否出现过指数符号(e或E)

        for (int i = 0; i < ch.length; i++) {
            char c = ch[i];

            // 处理数字
            if (Character.isDigit(c)) {
                hasDigit = true;
            }
            // 处理小数点
            else if (c == '.') {
                // 小数点不能出现多次，也不能在e/E后面出现
                if (hasDot || hasE) {
                    return false;
                }
                hasDot = true;
            }
            // 处理指数符号
            else if (c == 'e' || c == 'E') {
                // e/E不能出现多次，且前面必须有数字
                if (hasE || !hasDigit) {
                    return false;
                }
                hasE = true;
                hasDigit = false;  // e/E后面必须有数字
            }
            // 处理正负号
            else if (c == '+' || c == '-') {
                // 正负号只能出现在开头或e/E后面
                if (i != 0 && ch[i-1] != 'e' && ch[i-1] != 'E') {
                    return false;
                }
            }
            // 其他字符都是无效的
            else {
                return false;
            }
        }

        // 最后必须有数字
        return hasDigit;
    }
}




// 力扣81. 搜索旋转排序数组 II
class Solution1 {
    public boolean search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // 找到目标值
            if (nums[mid] == target) {
                return true;
            }

            // 处理重复元素，无法判断哪部分有序
            if (nums[left] == nums[mid] && nums[mid] == nums[right]) {
                left++;
                right--;
            }
            // 左半部分有序
            else if (nums[left] <= nums[mid]) {
                // 目标在左半部分
                if (nums[left] <= target && target < nums[mid]) {
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            }
            // 右半部分有序
            else {
                // 目标在右半部分
                if (nums[mid] < target && target <= nums[right]) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }

        // 未找到目标值
        return false;
    }
}
